www.gusucode.com > 有监督的 CNN 网络完成对MNIST 数字的识别 > 有监督的 CNN 网络完成对MNIST 数字的识别/CNN—卷积神经网络数字识别/@cnn/adapt_dw.m

    function cnet = adapt_dw(cnet,dW)
%ADAPT_DW apply calculated weights and biases gradient 
%
%  Syntax
%  
%    cnet = adapt_dw(cnet,dW)
%    
%  Description
%   Input:
%    cnet - Convolutional neural network class object
%    dW - delta weights and biases as a single vector
%   Output:
%    cnet - convolutional neural network with updated weights and biases

%Weight pointer in reverse order (1 means the bias of the last neuron of last layer)
wPtr = 1;
%==========First all F-layers
for k=cnet.numLayers:-1:(cnet.numLayers-cnet.numFLayers+1)
    %Calculate total number of weights for the layer
    sz = numel(cnet.FLayer{k}.W);
    %Update weights
    cnet.FLayer{k}.W = cnet.FLayer{k}.W-reshape(dW(wPtr:(wPtr+sz-1)),size(cnet.FLayer{k}.W));
    %Increment pointer
    wPtr = wPtr+sz;

    %Calculate total number of biases for the layer
    sz = numel(cnet.FLayer{k}.B);
    %Update biases
    cnet.FLayer{k}.B = cnet.FLayer{k}.B-dW(wPtr:(wPtr+sz-1))';
    %Increment pointer
    wPtr = wPtr+sz;
end


%Main loop
for k=(cnet.numLayers-cnet.numFLayers):-1:2 %(all except first layer, its dummy) 
    if(rem(k,2)) %Parity check
        %S-Layer
        %Calculate total number of weights for the layer
        sz = numel(cnet.SLayer{k}.WS)*numel(cnet.SLayer{k}.WS{1});
        %Size of feature map
        mW = cnet.SLayer{k}.FMapWidth;
        mH = cnet.SLayer{k}.FMapHeight;        
        %Updating weights
        %Initialize dimension vectors to convert to cell array
        vVert=ones(cnet.SLayer{k}.numFMaps,1)*mH;
        vHoriz = mW;  
        %Convert cell to matrix and update weights
        Wnew = cell2mat(cnet.SLayer{k}.WS') - reshape(dW(wPtr:(wPtr+sz-1)),cnet.SLayer{k}.numFMaps,[]);        
        %Convert back to cell array
        cnet.SLayer{k}.WS = num2cell(Wnew)';        
        %Increment pointer
        wPtr = wPtr+sz;

        %Calculate total number of biases for the layer
        sz = numel(cnet.SLayer{k}.BS)*numel(cnet.SLayer{k}.BS{1});
        %Size of feature map
        mW = cnet.SLayer{k}.FMapWidth;
        mH = cnet.SLayer{k}.FMapHeight;        
        %Updating biases
        %Initialize dimension vectors to convert to cell array
        vVert=ones(cnet.SLayer{k}.numFMaps,1)*mH;
        vHoriz = mW;
        %Convert cell to matrix and update weights
        Bnew = cell2mat(cnet.SLayer{k}.BS') - reshape(dW(wPtr:(wPtr+sz-1)),cnet.SLayer{k}.numFMaps,[]);        
        %Convert back to cell array
        cnet.SLayer{k}.BS = num2cell(Bnew)';
        %Increment pointer
        wPtr = wPtr+sz;
    else
    %C-Layer
        %Calculate total number of weights for the layer
        sz = numel(cnet.CLayer{k}.WC)*numel(cnet.CLayer{k}.WC{1});
        %Size of convolution kernel
        mW = cnet.CLayer{k}.KernWidth;
        mH = cnet.CLayer{k}.KernHeight;        
        %Updating weights
        %Initialize dimension vectors to convert to cell array
        vVert=ones(cnet.CLayer{k}.numKernels,1)*mH;
        vHoriz = mW;
        %Convert cell to matrix and update weights
        Wnew = cell2mat(cnet.CLayer{k}.WC) - reshape(dW(wPtr:(wPtr+sz-1)),[],mW*cnet.CLayer{k}.numKernels);        
        %Convert back to cell array
        cnet.CLayer{k}.WC = mat2cell(Wnew,vHoriz,vVert);
        %Increment pointer
        wPtr = wPtr+sz;

        %Calculate total number of biases for the layer
        sz = numel(cnet.CLayer{k}.BC)*numel(cnet.CLayer{k}.BC{1});
        %Updating biases
        %Convert cell to matrix and update weights
        Bnew = cell2mat(cnet.CLayer{k}.BC) - dW(wPtr:(wPtr+sz-1))';        
        %Convert back to cell array
        cnet.CLayer{k}.BC = num2cell(Bnew);
        %Increment pointer
        wPtr = wPtr+sz;

    end
end


end